package com.gtw.flyweight;

/**
 * 享元模式是池技术的重要实现方式,有两个要求:细粒度的对象和共享对象
 * 对象分为两个部分:内部状态和外部状态
 * 内部状态:是对象可以共享出来的对象,并且不会随环境的改变而改变
 * 外部状态:是对象可以依赖的一个标记,是随环境的改变而改变的,不可共享的状态
 * 优点:
 *      大大减少应用程序创建对象,降低程序内存的占用
 * 缺点:
 *      提高了系统复杂度,要分离出内部状态和外部状态
 * 使用场景:
 *      1.系统中存在大量相似的对象
 *      2.细粒度的对象都具备较接近的外部状态,而且内部状态都与环境无关
 *      3.需要缓冲池的场景
 */
public abstract class FlyWeight {

    /**
     * 同时定义出对象的内部状态和外部状态的接口或实现,以免子类随便扩展
     */
    private String intrinsic;
    /**
     * 外部状态加上final字段,防止获得外部状态随意修改,外部状态最好以Java的基本类型作为标志,可以大幅提升效率
     */
    private final String extrinsic;

    //具体的业务操作
    public abstract void operate();

    public FlyWeight(String extrinsic) {
        this.extrinsic = extrinsic;
    }

    public String getIntrinsic() {
        return intrinsic;
    }

    public void setIntrinsic(String intrinsic) {
        this.intrinsic = intrinsic;
    }
}
